////////////////////////////////////////////////////////////////////////////////

#ifndef _CLIENT_GUI_H_
#define _CLIENT_GUI_H_

////////////////////////////////////////////////////////////////////////////////

#include <queue>
#include <string>
#include <boost/asio.hpp>

////////////////////////////////////////////////////////////////////////////////

class Client;
struct ServerPacket;
struct ClientPacket;

////////////////////////////////////////////////////////////////////////////////

union SDL_Event;
struct SDL_Surface;
struct SDL_Rect;


/** Game client GUI manager
*
*   Based on Simple DirectMedia Layer(SDL) -- cross-platform multimedia library
*
*  @author   Roman Pasechnik
*  @since    Jun 11th, 2009
*  @updated  Jun 22th, 2009
*/
class ClientGUI
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ClientGUI( Client* _client, boost::asio::io_service& _io_servive );
    
    
    /** Destructor */
    ~ClientGUI();

    
////////////////////////////////////////////////////////////////////////////////


    /** Start GUI */
    void Start();


    /** Draw server packet */
    void Draw( const ServerPacket& _packet );


////////////////////////////////////////////////////////////////////////////////

private:    
    
////////////////////////////////////////////////////////////////////////////////


    /** Load Image */
    SDL_Surface* LoadImage( std::string _fileName );


    /** Draw one image on another */
    void ApplySurface( int x,
                       int y,
                       SDL_Surface* source,
                       SDL_Surface* destination,
                       SDL_Rect* clip = NULL );


    /** Process SDL event */
    void ProcessEvent( const SDL_Event& _event );


////////////////////////////////////////////////////////////////////////////////


    /** Screen surface */
    SDL_Surface* m_Screen;


    /** Player surface */
    SDL_Surface* m_Player;


    /** Bullet surface */
    SDL_Surface* m_Bullet;


    /** IO service object */
    boost::asio::io_service& m_io_service;


    /** Deadline timer for repeating game loop */
    boost::asio::deadline_timer m_Timer;


    /** Client interface */
    Client* m_Client;


////////////////////////////////////////////////////////////////////////////////
};
    
    
////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

